package com.gupaoedu.vip.registry;

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;


import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;


/**
 *  注册中心怎么实现，这里用zk的API实现
 *
 *  这里简单的处理，了解一个思想。  不做很复杂的封装
 *
 *  服务注册的本质：就是zk上节点的创建。
 */
public class RegistryCenterWithZk implements IRegistryCenter{


    CuratorFramework curatorFramework =null;

    {
        //初始化zookeeper的连接， 会话超时时间是5s，衰减重试
        curatorFramework = CuratorFrameworkFactory.builder().
                connectString(ZkConfig.CONNECTION_STR).sessionTimeoutMs(5000).
                retryPolicy(new ExponentialBackoffRetry(1000, 3)).
                namespace("registry")
                .build();
        curatorFramework.start();
    }


    @Override
    public void registry(String serviceName, String serviceAddress) {
        String servicePath="/"+serviceName;
        try {
            //判断节点是否存在   （联想一下：这里就是dubbo里的group）
            if(curatorFramework.checkExists().forPath(servicePath)==null){
                curatorFramework.create().creatingParentsIfNeeded().
                        withMode(CreateMode.PERSISTENT).forPath(servicePath);
            }
            //serviceAddress: ip:port   这里是具体的服务地址。。。。
            String addressPath=servicePath+"/"+serviceAddress;
            //这里用的就是  临时节点了。。
            //为什么是临时节点？
            // 因为serviceAddress是一个服务地址，我们希望服务节点发生变化后，它要自动删除掉。
            // 这就刚好符合zk临时节点的特性：会话结束，临时节点会被删除
            curatorFramework.create().withMode(CreateMode.EPHEMERAL).forPath(addressPath); //创建节点的路径是什么
            System.out.println("服务注册成功");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
